using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using NEXEntidad;
using NEXServicio;

namespace NEXEntidad
{
    #region Autor

    public class Autor : NEXEntidad.NEXEntidadElemento
    {
        #region Constructores

        public Autor(int idAutor)
            : base(idAutor)
        {
            this.Id = idAutor;
        }
        public Autor(int idAutor, bool obtener)
            : base(idAutor)
        {
            this.Id = idAutor;
        }
        public Autor()
            : base()
        {
        }
        #endregion

        #region Campos/Propiedades

        private String fNombre;
        public String Nombre
        {
            get
            {
                return this.fNombre;
            }
            set
            {
                this.fNombre = value;
            }
        }

        private String fApellido;
        public String Apellido
        {
            get
            {
                return this.fApellido;
            }
            set
            {
                this.fApellido = value;
            }
        }

        private String fResumen;
        public String Resumen
        {
            get
            {
                return this.fResumen;
            }
            set
            {
                this.fResumen = value;
            }
        }

        private Pais fPaisNacimiento;
        public Pais PaisNacimiento
        {
            get
            {
                return fPaisNacimiento;
            }
            set
            {
                fPaisNacimiento = value;
            }
        }

        private string fCiudadNacimiento;
        public string CiudadNacimiento
        {
            get
            {
                return fCiudadNacimiento;
            }
            set
            {
                fCiudadNacimiento = value;
            }
        }

        private Pais fPaisNacionalidad;
        public Pais PaisNacionalidad
        {
            get
            {
                return fPaisNacionalidad;
            }
            set
            {
                fPaisNacionalidad = value;
            }
        }

        private DateTime? fFechaNacimiento;
        public DateTime? FechaNacimiento
        {
            get
            {
                return fFechaNacimiento;
            }
            set
            {
                fFechaNacimiento = value;
            }
        }

        private DateTime? fFechaFallecimiento;
        public DateTime? FechaFallecimiento
        {
            get
            {
                return fFechaFallecimiento;
            }
            set
            {
                fFechaFallecimiento = value;
            }
        }

        private int? fAnioNac;
        public int? AnioNacimiento
        {
            get
            {
                return fAnioNac;
            }
            set
            {
                fAnioNac = value;
            }
        }

        private int? fAnioFallecimiento;
        public int? AnioFallecimiento
        {
            get
            {
                return fAnioFallecimiento;
            }
            set
            {
                fAnioFallecimiento = value;
            }
        }

        //private bool fEsInsert;
        //public bool EsInsert
        //{
        //    get
        //    {
        //        return fEsInsert;
        //    }
        //    set
        //    {
        //        fEsInsert = value;
        //    }
        //}


        //private List<Libro> fLibros;
        //public List<Libro> Libros
        //{
        //    get
        //    {
        //        return this.fLibros;
        //    }
        //    set
        //    {
        //        this.fLibros = value;
        //    }
        //}

        #endregion

        #region Metodos Publicos
        public static AutorCollection Listar()
        {
            return Autor.CrearListaCargada(ServicioAutor.Listar().Tables[ServicioAutor.DataTableName].Rows);
        }

        public static AutorCollection Listar(String apellido)
        {
            return Autor.CrearListaCargada(ServicioAutor.Listar(apellido).Tables[ServicioAutor.DataTableName].Rows);
        }

        public static ElementoCollection ListarEntidad(String apellido)
        {
            ElementoCollection lista = new ElementoCollection();
            AutorCollection listaAutores;
            listaAutores = Autor.CrearListaCargada(ServicioAutor.Listar(apellido).Tables[ServicioAutor.DataTableName].Rows);
            foreach (Autor unAutor in listaAutores)
            {
                NEXEntidadElemento elemento;
                elemento = (NEXEntidadElemento)unAutor;
                elemento.Descripcion = unAutor.ToString();

                lista.Add(elemento);

            }
            return lista;
        }

        /// <summary>
        /// Debe comprobar si el nombre y apellido del autor son iguales.
        /// </summary>
        /// <returns>Retorna si existe o no el autor que se intenta agregar.</returns>
        public bool ExisteAutor()
        {
            //AutorCollection listaAutores;

            try
            {
                //listaAutores = Autor.Listar(this.Apellido);
                //return (listaAutores.Count > 0);
                return false;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override string ToString()
        {
            return this.Apellido + " " + this.Nombre ;
        }

        #endregion

        #region Metodos de Carga

        internal static Autor Crear(DataRow dataRow)
        {
            Autor autor = new Autor(Convert.ToInt32(dataRow["IdAutor"].ToString(), System.Globalization.CultureInfo.CurrentCulture));
            return autor;
        }

        private static void Cargar(Autor autor, DataRow drAutor)
        {
            Autor.Cargar(autor, drAutor, false);
        }

        private static Autor CrearCargado(DataRow drAutor)
        {
            return CrearCargado(drAutor, false);
        }

        private static Autor CrearCargado(DataRow drAutor, bool completo)
        {
            Autor autor = new Autor();
            Autor.Cargar(autor, drAutor);

            return autor;
        }

        private static void Cargar(Autor autor, DataRow drAutor, Boolean dataRowSolapado)
        {
            String nombreSolapado = !dataRowSolapado ? "" : "Autor_";
            autor.Id = Convert.ToInt32(drAutor["IdAutor"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            autor.Apellido = drAutor[nombreSolapado + "Apellido"].ToString();
            autor.Nombre = drAutor[nombreSolapado + "Nombre"].ToString();
            autor.GUId = new Guid(drAutor["GuidAutor"].ToString());
            autor.Resumen = drAutor[nombreSolapado + "Resumen"].ToString();
            if (!dataRowSolapado)
            {
                autor.CiudadNacimiento = drAutor[nombreSolapado + "Ciudad"].ToString();
                if (drAutor[nombreSolapado + "AnioDefuncion"].ToString() != "")
                    autor.AnioFallecimiento = Convert.ToInt32(drAutor[nombreSolapado + "AnioDefuncion"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
                if (drAutor[nombreSolapado + "AnioNacimiento"].ToString() != "")
                    autor.AnioNacimiento = Convert.ToInt32(drAutor[nombreSolapado + "AnioNacimiento"].ToString(), System.Globalization.CultureInfo.CurrentCulture);

                if (drAutor["IdPaisNacimiento"].ToString() != "")
                    autor.PaisNacimiento = new Pais(Convert.ToInt32(drAutor["IdPaisNacimiento"].ToString(), System.Globalization.CultureInfo.CurrentCulture));
                if (drAutor["IdPaisNacionalidad"].ToString() != "")
                    autor.PaisNacionalidad = new Pais(Convert.ToInt32(drAutor["IdPaisNacionalidad"].ToString(), System.Globalization.CultureInfo.CurrentCulture));
                autor.FechaNacimiento = (drAutor[nombreSolapado + "FechaNacimiento"] != DBNull.Value) ? (DateTime?)drAutor[nombreSolapado + "FechaNacimiento"] : null;
                autor.FechaFallecimiento = (drAutor[nombreSolapado + "FechaDefuncion"] != DBNull.Value) ? (DateTime?)drAutor[nombreSolapado + "FechaDefuncion"] : null;

            }
            autor.ObjetoCargado();
        }

        internal static Autor CrearCargadoCompleto(System.Data.DataRow drAutor, Boolean dataRowSolapado)
        {
            String nombreSolapado = !dataRowSolapado ? "" : "Autor_";
            Autor autor = new Autor();
            Autor.Cargar(autor, drAutor, dataRowSolapado);
            return autor;
        }

        protected override void Obtener()
        {
            using (DataSet ds = ServicioAutor.Obtener(this.Id, this.GUId))
            {
                DataTable dtAutor = ds.Tables[ServicioAutor.DataTableName];
                if (dtAutor.Rows.Count > 0)
                {
                    DataRow drAutor = dtAutor.Rows[0];
                    Autor.Cargar(this, drAutor);
                }
                else
                {
                    throw new ObjetoInexistenteException("Autor");
                }
            }

        }

        private static AutorCollection CrearListaCargada(System.Data.DataRowCollection dataRowCollection)
        {
            AutorCollection autores = new AutorCollection();
            foreach (DataRow drAutor in dataRowCollection)
            {
                autores.Add(Autor.CrearCargado(drAutor, true));
            }
            return autores;
        }
        #endregion

        #region Metodos para Salvar
        protected override int SalvarObjeto(NEX_Datos.Transaccion transaccion)
        {
            try
            {
                if (this.EsInsert == true && this.ExisteAutor())
                {
                    throw new Exception("Ya existe el autor que intenta agregar");
                }
                Int32 idAutor = ServicioAutor.Salvar(transaccion,
                                this.Id, this.Apellido, this.Nombre, this.Resumen,
                                this.FechaNacimiento, this.FechaFallecimiento,
                                this.PaisNacimiento.Id, this.CiudadNacimiento, this.AnioNacimiento,
                                this.AnioFallecimiento, this.PaisNacionalidad.Id, true, this.EsInsert);
                return idAutor;
            }
            catch (Exception ex)
            {
                
                throw;
            }
            
        }
        #endregion

        #region Metodos para eliminar
        protected override Boolean EliminarObjeto(NEX_Datos.Transaccion transaccion)
        {
            return ServicioAutor.Eliminar(transaccion, this.Id);
        }
        #endregion
    }
    #endregion

    #region AutorCollection

    [Serializable]
    public class AutorCollection : NEXCollection<Autor>
    {
    }

    #endregion

}
